#pragma once

#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>




#include <functional>
#include <mutex>

#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>

#include <QDebug>

#include "jUdp.hh"


class jApi_t {

public:
	typedef enum param_json_Index
	{
		//VCU params
		Json_bitare,
		Json_fmt,
		Json_gdrmode,
		Json_gop,
		Json_vcu_mode,
		Json_framerate,
		Json_videoHeight,
		Json_videoWidth,
		Json_max
	}JsonparamIndex;

	typedef enum param_json_Type_t
	{
		PARAM_NUM,
		PARAM_STR,
	}JsonparamType;

	typedef union param_json_Value_t
	{
		int val;
		char *str;
	}JsonparamValue;
    jApi_t();

    QJsonObject sendCmd(QJsonObject cmd);   // 以阻塞模式发送指令， 返回指令结果
    void   sendCmd_noblock( QJsonObject cmd ); // 非阻塞模式发送指令。获取返回值需要调用getLastMsg   
    QJsonObject getLastMsg(int blockMode=1);  // 0 非阻塞， 非0 阻塞  

    static const char* jsonToString( QJsonObject obj );  // 将json转换为 char *
    static QJsonObject stringToJson( const char *buf, int strlen ); // string 转 json

	int set_json_codec_param_setting(JsonparamIndex index, int id, void *val);
	int get_json_codec_param_setting(JsonparamIndex index, int id);

	int json_params_init();
    // 以下是测试演示， 不建议直接使用
    const char* getAllInfo(void);  // 获取编码器所有信息

    void printCodecInfo(int id);

    bool setCodecRate(int id, int rate);


    
private:
    udpSocket_t *updSocket = nullptr;

    static void udpRev(struct in_addr addr, uint16_t port, void *buff, int len, void *dev);

    std::mutex msgMut;
    bool newMsgIn = false;
    QJsonObject lastMsg;
};




